home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / t3_1 / nexttsrc.lha / nexttsources / nexttsystem / nextassist.c < prev    next >
C/C++ Source or Header  |  1990-06-22  |  2KB  |  98 lines

  1. /* This file contains main and the argument processing for T. */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <strings.h>
  6.  
  7. #define MIN_HEAP_SIZE (1 << 19)  /* .5 Mb */
  8. #define DEFAULT_HEAP_SIZE (1 << 22) /* 4 Mb  */
  9.  
  10. int main(int argc, char *argv[])
  11. {
  12.   long heap_wanted = -1;
  13.   long debug = 0;
  14.   long errors = 0;
  15.   void *the_heaps;
  16.   long total, aligned_total;
  17.   long heap_size, aligned_heap_size;
  18.  
  19.   int ac = argc - 1;
  20.   char **av = argv + 1;
  21.  
  22.   int start_t(long, long, long, int, char **, long);  
  23.  
  24.   for (; ac > 0; ac--, av++)
  25.     if (av[0][0] == '-')
  26.       switch (av[0][1]) {
  27.       case 'h':
  28.         (*av)++;
  29.         if (strcmp(*av, "h") != 0 && strcmp(*av, "heap") != 0) break;
  30.     ac--; av++;
  31.     if (ac == 0) { errors++; break; }
  32.     heap_wanted = atoi(*av);
  33.     if (heap_wanted <= 0) errors++;
  34.     if (heap_wanted < MIN_HEAP_SIZE) {
  35.       fprintf(stderr,"Heap requested is too small.\n");
  36.       heap_wanted = MIN_HEAP_SIZE;
  37.     }
  38.     break;
  39.       case 'd':
  40.         if (strcmp(*av, "d") != 0 && strcmp(*av, "debug") != 0) break;
  41.     debug = -1;
  42.     break;
  43.       }
  44.   if (errors != 0) {
  45.     fprintf(stderr,"Usage: %s [-d] [-h <heap size in bytes>]\n", argv[0]);
  46.     exit (1);
  47.   }
  48.  
  49.   heap_size = heap_wanted > 0 ? heap_wanted : DEFAULT_HEAP_SIZE;
  50.  
  51.   the_heaps = malloc( heap_size * 2 );
  52.   if (the_heaps == NULL)  {
  53.     fprintf(stderr,
  54.         "T could not allocate two heaps of %d bytes.\n", heap_size);
  55.     fprintf(stderr,
  56.         "Please retry with smaller heaps by using the -h switch.\n");
  57.     exit(1);
  58.   }
  59.  
  60.   total = (long) the_heaps;
  61.  
  62.   /* make heaps smaller (if necessary) for quadword alignment */
  63.  
  64.   aligned_total = (total + 15) & 0xFFFFFFF0;
  65.   aligned_heap_size = ( ((heap_size * 2) - (aligned_total - total))
  66.                & 0xFFFFFFF0 );
  67.  
  68.   heap_size = aligned_heap_size / 2;
  69.  
  70.   /* print message if any command line flag is given */
  71.  
  72.   if (heap_wanted != -1)
  73.     fprintf(stderr,"%d bytes per heap\n", heap_size);
  74.  
  75.   return start_t( aligned_total, (aligned_total + heap_size),
  76.          heap_size, argc, argv, debug);
  77. }
  78.  
  79. void gc_interrupt(void)
  80. {
  81.   fprintf(stderr, "Interrupted during GC; "
  82.       "'q' to exit, anything else to continue GC.\n");
  83.   if (getchar() == 'q')
  84.     exit(0);
  85. }
  86.  
  87. extern int errno;
  88. extern char *sys_errlist[];
  89. extern int sys_nerr;
  90.  
  91. void get_unix_error_msg(char *t, int size) 
  92. {
  93.   char *r; char *s;    
  94.   r = sys_errlist[ errno ];
  95.   s = t + size;
  96.   while (t < s && ((*t++ = *r++) != '\0'));
  97. }
  98.